#ifndef _BUOLA_GL_CVBOMAP_H_
#define _BUOLA_GL_CVBOMAP_H_

#include <buola/gl.h>

namespace buola { namespace gl {

template<typename tType>
class CVBOMap
{
public:
    CVBOMap()
        :   mData(nullptr)
    {}
    
    CVBOMap(tType *pData,size_t pSize)
        :   mData(pData)
        ,   mSize(pSize)
        ,   mPtr(pData)
    {}
    
    CVBOMap(const CVBOMap&)=delete;
    CVBOMap(CVBOMap &&pO)
        :   mData(pO.mData)
        ,   mSize(pO.mSize)
        ,   mPtr(pO.mPtr)
    {
        pO.mData=nullptr;
    }
    
    ~CVBOMap()
    {
        assert(!mData);
    }

    CVBOMap &operator=(const CVBOMap&)=delete;

    CVBOMap &operator=(CVBOMap &&pO)
    {
        std::swap(mData,pO.mData);
        mSize=pO.mSize;
        mPtr=pO.mPtr;
        return *this;
    }

    CVBOMap &operator<<(const tType &pData)
    {
        *(mPtr++)=pData;
        return *this;
    }

    CVBOMap &operator<<(const CPoint<tType> &pData)
    {
        *(mPtr++)=pData.x;
        *(mPtr++)=pData.y;
        return *this;
    }

    explicit operator bool()    {   return mData;   }

    void Release()
    {
        assert(mData);
        mData=nullptr;
    }

private:
    tType *mData;
    size_t mSize;
    tType *mPtr;
};

/*namespace gl*/ } /*namespace buola*/ }

#endif
